from flask import Flask, jsonify, render_template
from flask_cors import CORS
from extension import db
from flask_jwt_extended import JWTManager
from config import Config

# 导入所有模型
from models import *

# **全局初始化**：直接绑定 app 和 db（适合简单项目）
app = Flask(__name__)
app.config.from_object(Config)  # 加载配置

# 初始化扩展（此时 app 已配置，db 可直接关联）
db.init_app(app)
jwt = JWTManager(app)

# 配置CORS（跨域资源共享）
CORS(app, resources={
    r"/api/*": {
        "origins": "*",
        "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
        "allow_headers": ["Content-Type", "Authorization"]
    }
})

# 导入蓝图（此时 db 已初始化，避免循环依赖）
# 管理端路由
from routes.admin import (
    auth_bp,
    guest_bp,
    room_bp,
    reservation_bp,
    service_bp,
    dashboard_bp
)

# 注册蓝图
# 管理端
app.register_blueprint(auth_bp)
app.register_blueprint(guest_bp)
app.register_blueprint(room_bp)
app.register_blueprint(reservation_bp)
app.register_blueprint(service_bp)
app.register_blueprint(dashboard_bp)

# 根路由
@app.route('/')
def index():
    return render_template('index.html')

# JWT 错误处理
@jwt.expired_token_loader
def expired_token_callback(jwt_header, jwt_payload):
    return jsonify({"error": "Token已过期"}), 401

@jwt.invalid_token_loader
def invalid_token_callback(error):
    return jsonify({"error": "无效的Token"}), 401

@jwt.unauthorized_loader
def missing_token_callback(error):
    return jsonify({"error": "缺少授权Token"}), 401

@app.errorhandler(422)
def unprocessable_entity(error):
    return jsonify({"error": "请求格式错误或缺少必需字段"}), 422

# 错误处理
@app.errorhandler(404)
def not_found(error):
    return jsonify({"error": "未找到资源"}), 404

@app.errorhandler(500)
def internal_error(error):
    db.session.rollback()
    return jsonify({"error": "服务器内部错误"}), 500

# 开发环境自动创建表（生产环境用迁移工具）
if __name__ == '__main__':
    with app.app_context():
        if app.config['DEBUG']:
            db.create_all()
    app.run(debug=app.config['DEBUG'])

